#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <limits>
#include <vector>
#include <numeric>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>

using namespace std;

int cin_func() {
    string expression;
    cout << "请输入表达式: ";
    //getline(cin, expression);
    //string c;
    cin>>expression;
    std::cout << expression << std::endl;
    //std::cout << c << std::endl;
    return 0;
}

void stoi_function() {
    //字符串转换为整数；
    std::string str= "11";
    auto res = std::stoi(str);
    long long num = std::stoll(str);
    // 判断是不是数字字符
    auto res1 = isdigit('1');
    //判断字母
    auto res3 = isalpha();
    // 判断字母或者数字
    auto res2 = isalnum('1');
    // 转换字符
    int res4='c'-'0';
    char a=static_cast<char>(std::tolower('c'));
    //16进制转换
    std::string hex_str = "3F";
    int int_value = std::stoi(hex_str, nullptr, 16);
}

//整数转换为字符串
void funciton_to_tring() {
    string str = std::to_string(10);
}

//------string----------
void split(string s,vector<string>&ip,char c){
      size_t pos=s.find(c);
      while(pos!=std::string::npos){
        std::string tmp_str=s.substr(0,pos);
        s.erase(0,pos+1);
        ip.emplace_back(tmp_str);
        pos=s.find(c);
      }
      ip.emplace_back(s);
}
int atoi_() {
    //1.字符串char* 转换为整数
    char str[20];
    strcpy(str, "98993489");
    int val = atoi(str);
    //stoi，转换失败会抛出异常
    int res = stoi("123");
    //------string----------
    //substr 函数：https://zhuanlan.zhihu.com/p/402091896
    //find函数：https://juejin.cn/s/c%2B%2B%20string%20find%20%E7%94%A8%E6%B3%95
    //pop_back函数 ：https://juejin.cn/s/string%20pop_back%E5%87%BD%E6%95%B0
    //push_back 函数：https://juejin.cn/s/c%2B%2B%20string%20push_back%20%E7%94%A8%E6%B3%95
    //compare 函数：https://codeantenna.com/a/bKtwY2cU3N
    //resize 函数；https://blog.csdn.net/Milu_Jingyu/article/details/134248251
    //reserve 函数；
    //push_back 函数；
    //at函数；
    //count函数；
    return 0;
}

bool new_array() {
    //https://shenjun4cplusplus.github.io/cplusplushtml/%E7%AC%AC4%E7%AB%A0%20%E5%A4%8D%E5%90%88%E7%B1%BB%E5%9E%8B/4_7_6%20%E4%BD%BF%E7%94%A8%20new%20%E6%9D%A5%E5%88%9B%E5%BB%BA%E5%8A%A8%E6%80%81%E6%95%B0%E7%BB%84.html
}

bool bit_set() {
    //补码，原码，反码，https://www.cnblogs.com/andy-0212/p/10323502.html
}

//------iterator----------
void iterator_(){
    //迭代器运算-函数模板：https://blog.csdn.net/weixin_30788619/article/details/99271857
    //std::advance(iterator,num)：将迭代器iterator 移动了num个位置
    //std::distance(iterator1,iterator2)：返回两个迭代器之间的元素的个数
    //std::next(iterator,n):将iterator正向偏移n之后所指向位置的一个迭代器
    //std::prev(iterator,n)：返回iterator反向偏移n之后的所指向的一个迭代器
    //std::iter_swap：迭代器交换
    //https://blog.csdn.net/qq_37183287/article/details/125379396
    //std::next;
    //std::iter_swap：迭代器交换
}

//------list----------
void list_(){
    //list.empty:判断为空；
    //emplace_back：尾部插入元素；
    //push_back：尾部假如元素；
    //push_front：首部加入元素；
    //pop_back：尾部删除元素；
    //pop_front：首部删除元素；
    //list.erase:删除元素；
    //list.insert：插入元素；
    //list.clear：清楚链表；
    //list.splice：切除+拼接函数!!!；
    //list.swap:交换链表；
    //list.uniqu：去重操作；
    //list.reverse:反转链表；
    //list.sort:排序链表；
    //list.resize:修改大小
    //list.splice：函数修改元素位置；
    //迭代器： std::list<int>::iterator last_element_iterator = my_list.end();
    //--last_element_iterator; // 因为end()指向的是尾后元素，所以需要减1
}

//------vector----------
std::vector<int> copy_() {
    int left,right;
    // 方式1
    std::vector<int> array;
    std::vector<int> res_vec={array.begin()+left,array.begin()+right+1};
    // 方式2
    res_vec.resize(right-left+1);
    std::copy(array.begin()+left,array.begin()+right+1,res_vec.begin());
    //判断相等==
    std::vector<int> vec1{ 1, 2, 3, 4, 5, 6, 7 };
    std::vector<int> vec2{ 1, 2, 3, 4, 5, 6, 7, 9 };
    if (vec1 == vec2) {
        cout << "both ranges are exactly equal \n";
    }
    //删除元素，pop_back；
    vec1.pop_back();

    //找出最大元素
    std::cout<<*std::max_element(vec2.begin(),vec2.end())<<std::endl;

    //iterator迭代器操作；
    std::vector<int>::iterator lastElementIt = vec.end() - 1;
    std::vector<int>::iterator beginElementIt = vec.begin();

    //revers_iterator迭代器操作；
    std::vector<int>::reverse_iterator firstElementRIt = vec1.rbegin();
    vec.erase((firstElementRIt + 1).base());

    // 使用 std::copy_if 将小于等于 150 的元素复制到 vector 中
    std::copy_if(arr, arr + n, std::back_inserter(vec), [](int x) { return x <= 150; });
    // 使用 std::copy_if 将小于等于 150 的元素复制到 vector 中
    std::copy_if(vec.begin(), vec.end(), vec.begin(), [](int x) { return x <= 150; });
    // 删除所有偶数元素
    vec.erase(std::remove_if(vec.begin(), vec.end(), [](int x){ return x>150; }), vec.end());
}

//------set----------
class MyComparator {
public:
    bool operator()(const MyClass& a, const MyClass& b) const {
        return a.getValue() < b.getValue(); // 升序排序
    }
};
void function_set() {
    //判断相等==
    std::set<int> set1{ 1, 2, 3, 4, 5, 6, 7 };
    std::set<int> set2{ 1, 2, 3, 4, 5, 6, 7,9 };
    if (set1 == set2) {
        cout << "both ranges are exactly equal \n";
    }
    std::set<MyClass,MyComparator> mySet;
}


//------map----------
void function_map() {
    //equal_range，返回两个迭代器:https://zh.cppreference.com/w/cpp/container/multimap/equal_range
    std::multimap<char, int> m = {};
    auto ret = m.equal_range('b');
    for (auto it = ret.first; it != ret.second; ++it)
      cout << it->second << " ";
    // 利用find 实现相同key的打印；//https://deepinout.com/cpp/cpp-tutorials/g_multimap-find-in-cpp-stl.html

    //find使用，返回的是迭代器； 
    if (auto search = m.find(2); search != m.end())
        std::cout << "找到了 " << search->first << ' ' << search->second << '\n';
    else
        std::cout << "未找到\n";
    //inser方法
    std::map<int, std::string> my_map;
    auto result = my_map.insert(std::make_pair(1, "one"));
    //erase方法

    //初始化参数

};

//------std----------
// std::sort排序,c11排序算法
void sort_(){
    //https://blog.csdn.net/AAADiao/article/details/131011879
    std::vector<int> array {9,8,1,2};
    std::sort(array.begin(),array.end());
    //对字符串进行sort！！！
    std::string key="1234567";
    std::sort(key.begin(), key.end());
}
// std::reverse反转
void reverse_(){
    std::vector<int> v {1, 2, 3};
    std::for_each(v.begin(),v.end(),[](const int& a){std::cout << a << std::endl;});
    std::reverse(v.begin(), v.end());
    std::for_each(v.begin(),v.end(),[](const int&  a){std::cout << a << std::endl;});
}

// std::pow
void function_pow() {
    //https://en.cppreference.com/w/cpp/numeric/math/pow
     std::cout << "pow(2, 10) = " << std::pow(2, 10) << '\n'
              << "pow(2, 0.5) = " << std::pow(2, 0.5) << '\n'
              << "pow(-2, -3) = " << std::pow(-2, -3) << '\n';
}

// 计算相加
int add_() {
    std::vector<int> array;
    return std::accumulate(array.begin(), array.end(), 0);
}
// float
#include<math.h>
int float_(){
    //https://www.jianshu.com/p/7aaca30e1140
    //0.0 / 0.0 不会产生操作异常，而是会得到nan,not a number，表示“无效数字”
    //inf：infinite，表示“无穷大”;超出浮点数的表示范围
    //int isnormal(x)，判断x是否为一个数（非inf或nan），是返回1，其它返回0；
    //int isnan(x)，当x时nan返回1，其它返回0
    //int isinf(x) ,当x是正无穷是返回1，当x是负无穷时返回-1，其它返回0。
    //FLT_MAX\FLT_MIN
    //DBL_MAX\DBL_MIN
    //INT_MAX\INT_MIN
}

// 判断double 相等
bool isEqual(double a, double b) {
    //std::numeric_limits<T>::min()
    //std::numeric_limits<T>::max()
    //std::numeric_limits<T>::lowest()
    //std::numeric_limits<T>::epsilon():表示两个浮点值之间的差值；
    return std::abs(a - b) < std::numeric_limits<double>::epsilon();
}

//字符串大写转换
void transform_() {
    //toupper，tolower 不是std表空间的函数  是<ctype> 头文件的函数
    transform(str.begin(), str.end(), str.begin(), ::toupper);    
    transform(str.begin(), str.end(), str.begin(), ::tolower);    
}
//tan 与 atan
void func(){
    //double degrees = 45.0;
    //double radians = degrees * M_PI / 180.0;
    //cout << std::tan(radians) << endl;
    //std::cout << radians << std::endl;

    // double value = 1.0;
    // double angleInRadians = std::atan(value);
    // std::cout << "The arctangent of " << value << " is: " << angleInRadians << " radians" << std::endl;

    double angleInRadians = M_PI / 2; // 90度转换为弧度
    double sineValue = std::sin(angleInRadians);
    std::cout << "The sine of " << angleInRadians << " radians is: " << sineValue << std::endl;
}


//algorithm 使用
void algorithm(){
    //transform
    transform(str.begin(), str.end(), str.begin(), ::toupper);    
    transform(str.begin(), str.end(), str.begin(), ::tolower);    
    //numeric_limits
    std::abs(a - b) < std::numeric_limits<double>::epsilon();
    //计算相加
    std::accumulate(array.begin(), array.end(), 0);
    // 使用 std::copy_if 将小于等于 150 的元素复制到 vector 中
    std::copy_if(vec.begin(), vec.end(), vec.begin(), [](int x) { return x <= 150; });
    //std::copy-使用 std::back_inserter 自动调整容器大小
    std::copy(src.begin(), src.end(), std::back_inserter(dest));
    // 删除所有偶数元素
    vec.erase(std::remove_if(vec.begin(), vec.end(), [](int x){ return x>150; }), vec.end());
    //for_each
    std::for_each(v.begin(),v.end(),[](const int&  a){std::cout << a << std::endl;});
    //pow
    std::cout << "pow(2, 10) = " << std::pow(2, 10) << '\n';
    //reverse
    std::reverse(v.begin(), v.end());
    //find 函数
    std::find(vec.begin(), vec.end(), 3)
    //find_if
    auto it = std::find_if(vec.begin(), vec.end(), is_even);
    //sort
    std::sort(key.begin(), key.end());
    //stoi stoll isdigit isalpha isalnum atoi
    auto res = std::stoi(str);
    long long num = std::stoll(str);
    auto res1 = isdigit('1');
    auto res3 = isalpha();
    auto res2 = isalnum('1');
    int val = atoi(str);
    //*max_elements
    std::cout<<*std::max_element(vec2.begin(),vec2.end())<<std::endl;
    //binary_search
    std::cout << std::binary_search(vec.begin(),vec.end(),1,std::greater<int>())<<std::endl;
    //lower_bound
    auto res2 = std::lower_bound(vec1.begin()+max_loc+1, vec1.end(), target, std::greater<int>());
    //reverse，这个函数没有任何的返回值！！！
    std::reverse(vec1.begin(), vec1.end());
    
}